package com.kotlin.flong.coroutines

import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeoutOrNull

/**
 * @Author:liangjl
 * @Date: 2020/7/7-19:18
 * @Eamil:jilongliang@sina.com
 * @Description:
 * 1、withTimeout函数调用所抛出的TimeoutCancellationException异常是CancellationException的子类，当该异常抛出时，我们并没有
 * 在控制台上看到整个异常堆栈信息，这是因为在取消协程的过程中，CancellationException被任务是一种协程完成的正常原因
 * 不过，我们在该示列中，在main函数中使用了withTimeout仅仅是一个异常而已，所有的资源也都会已通常的方式来关闭，那么我们可以将相关代码放到让一个try...catch
 * 块中，以外kotlin还提供另外一个更加友好的的函数调用withTimeoutOrNull,从功能角度来看，它非常类似withTimeout，不过当超时发生时，它并不会 抛出
 * CancellationException异常，而是会直接返回null
 *
 * 2、对于withTimeout函数调用来说，如果将其放置到try...catch块中，那么调用形式就是下面这样
 *
 */
fun main() = runBlocking {
    var result = withTimeoutOrNull(1900) {
        repeat(1000) { i ->
            println("hello,$i")
            delay(300)
        }
        "周伯通"
    }

    println(result)
}